#ifndef INC_MODEL_ATOM_H
#define INC_MODEL_ATOM_H

#include <string>

/**
 * FDMDE internal representation of an atom
 */
struct Atom
{
    Atom()
        : id(0), 
          x(0), 
          y(0), 
          z(0)
    {
    }
    
    Atom(const Atom& other)
        : id(other.id), 
          x(other.x), 
          y(other.y), 
          z(other.z)
    {
    }
    
    Atom(int id, const std::string& fqn, float x, float y, float z)
        : id(id), 
          fqn(fqn), 
          x(x), 
          y(y), 
          z(z)
    {
    }

    Atom(int id, const std::string& fqn)
        : id(id), 
          fqn(fqn)
    {
    }

    void setPosition(float newx, float newy, float newz)
    {
        x = newx;
        y = newy;
        z = newz;
    }

    Atom* clone() const
    {
        return new Atom(*this);
    }

    int id;
    // Fully qualified name. Unique id for an atom in a residue (i.e. you could
    // find two atoms of type "C" but both of them will have != fqn
    const std::string fqn;
    float x, y, z;
};

#endif /* INC_MODEL_ATOM_H */
